package com.flower.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.flower.mapper.IOrderDao;
import com.flower.pojo.Order;
import com.flower.pojo.OrderItem;
import com.flower.pojo.request_param.CreateOrderParam;
import com.flower.pojo.request_param.EditOrderParam;
import com.flower.response.ResultUtils;
import com.flower.service.IOrderService;

/**
 * 订单模块
 */
@Service("orderService")
@Transactional
public class OrderServiceImpl implements IOrderService{
	
	@Resource(name = "IOrderDao")
	private IOrderDao iOrderDao;

	@Override
	public int insertOrder(Order order) {
		return iOrderDao.insertOrder(order);
	}

	@Override
	public List<Order> selectAllOrders() {
		return iOrderDao.selectAllOrders();
	}

	@Override
	public int deleteOrder(int oid) {
		return iOrderDao.deleteOrder(oid);
	}

	@Override
	public List<Order> findOrder(int uid, int ostate) {
		return iOrderDao.findOrder(uid, ostate);
	}

	@Override
	public int updateOstate(int uid, int ostate, int pid, String onum) {
		return iOrderDao.updateOstate(uid, ostate, pid, onum);
	}
	
	/**
	 * 根据订单id获取订单详情数据
	 */
	@Override
	public Object showOrderDetails(String orderId) {
		//数据校验
		Object result = this.checkShowOrderDetails(orderId);
		if(result != null){
			return result;
		}
		//根据订单id获取订单详情数据
		return iOrderDao.findOrderById(orderId);
	}
	/**
	 * 根据订单id获取订单详情数据校验
	 * @author 黄静娜
	 * @date 2019年12月15日 下午3:18:43
	 * @param orderId
	 * @return
	 */
	private Object checkShowOrderDetails(String orderId) {
		if(!StringUtils.isNotBlank(orderId) || orderId.length() > 36) {
			return ResultUtils.error("系统繁忙,请联系管理员", null);
		}
		//判断数据库中的id是否存在
		boolean flag = iOrderDao.isexistOrderId(orderId);
		if(!flag) {
			return ResultUtils.error("系统繁忙,请联系管理员", null);
		}
		return null;
	}
	/**
	 * 订单处理
	 */
	@Override
	public Object editOrder(EditOrderParam editOrderParam) {
		//数据校验
		Object result = this.checkEditOrder(editOrderParam);
		if(result != null) {
			return result;
		}
		//根据订单状态,修改订单(发货状态需要减商品库存)
		this.orderHandler(editOrderParam);
		//友好提示
		return ResultUtils.success("处理成功~");
	}
	/**
	 * 处理订单
	 * @author 黄静娜
	 * @date 2019年12月15日 下午5:15:08
	 * @param editOrderParam
	 */
	private void orderHandler(EditOrderParam editOrderParam) {
		Integer orderStatus = editOrderParam.getOrderStatus();
		//需要减库存&修改订单状态
		if(orderStatus == 2 || orderStatus == 3) {
			iOrderDao.updateOrderAndProductAndOrderItemByOrderIdAndItemSendCount(
					editOrderParam.getOrderId(),
					editOrderParam.getOrderStatus(),
					editOrderParam.getItemSendCount());
			return;
		}
		//仅修改订单状态
		iOrderDao.updateOrderStatusByOrderId(
				editOrderParam.getOrderId(),
				editOrderParam.getOrderStatus());
	}

	/**
	 * 订单处理数据校验
	 * @author 黄静娜
	 * @date 2019年12月15日 下午4:50:15
	 * @param editOrderParam
	 * @return
	 */
	private Object checkEditOrder(EditOrderParam editOrderParam) {
		String orderId = editOrderParam.getOrderId();
		Integer orderStatus = editOrderParam.getOrderStatus();
		Integer itemSendCount = editOrderParam.getItemSendCount();
		//校验订单id
		Object result = this.checkOrderId(orderId);
		if(result != null) {
			return result;
		}
		//校验订单状态
		if(orderStatus == null) {
			return ResultUtils.error("请设置订单状态", null);
		}
		if(orderStatus < 0 || orderStatus > 3) {
			return ResultUtils.error("订单状态不合法~", null);
		}
		//校验发货数量
		switch (orderStatus) {
		//部分发货
		case 2:
			result = this.checkItemSendCount(orderId,itemSendCount);
			if(result != null) {
				return result;
			}
			break;
		//全部发货
		case 3:
			result = this.checkItemSendCount(orderId,itemSendCount);
			if(result != null) {
				return result;
			}
			break;
		}
		return null;
	}
	/**
	 * 校验商品发货数量
	 * @author 黄静娜
	 * @param orderId 
	 * @date 2019年12月15日 下午4:58:28
	 * @param itemSendCount
	 * @return
	 */
	private Object checkItemSendCount(String orderId, Integer itemSendCount) {
		if(itemSendCount == null || itemSendCount <= 0) {
			return ResultUtils.error("请输入发货数量", null);
		}
		//判断发货数量是否合法
		//大于库存,大于购买数量
		boolean flag = iOrderDao.checkItemSendCount(orderId,itemSendCount);
		if(!flag) {
			return ResultUtils.error("发货数量大于库存/大于购买数量", null);
		}
		return null;
	}

	/**
	 * 订单id数据校验
	 * @author 黄静娜
	 * @date 2019年12月15日 下午4:51:43
	 * @param orderId
	 * @return
	 */
	private Object checkOrderId(String orderId) {
		if(!StringUtils.isNotBlank(orderId) || orderId.length() > 36) {
			return ResultUtils.error("系统繁忙,请联系管理员~", null);
		}
		boolean flag = iOrderDao.isexistOrderId(orderId);
		if(!flag) {
			return ResultUtils.error("系统繁忙,请联系管理员~", null);
		}
		return null;
	}

	/**
	 * 查询所有订单的详情（用于我的订单）
	 */
	@Override
	public List<Map<String, Object>> findOrdersByUId(int uid) {
		return iOrderDao.findOrderByUId(uid);
	}
	
	/**
	 * 保存订单商品数据
	 */
	@Override
	public int saveOrderItem(CreateOrderParam order) {
		this.checkSaveOrderItem(order);
		OrderItem orderItem = new OrderItem();
		orderItem.setCreateTime(new Date());
		orderItem.setUpdateTime(new Date());
		orderItem.setId(UUID.randomUUID().toString().replace("-", ""));
		orderItem.setOrderId(order.getOid());
		orderItem.setPayCount(order.getPayCount());
		orderItem.setSendCount(0);
		return iOrderDao.saveOrderItem(orderItem);
	}
	/**
	 * 保存订单商品数据校验
	 * @author 黄静娜
	 * @date 2019年12月17日 下午8:46:55
	 * @param order
	 * @return
	 */
	private void checkSaveOrderItem(CreateOrderParam order) {
		Integer payCount = order.getPayCount();
		if(payCount == null || payCount == 0) {
			order.setPayCount(1);
		}
	}

}
